opencv |
您所在的位置:网站首页 › morphological resultspdf › opencv |
opencv —— morphology形态学操作函数讲解
目录 opencv —— morphology形态学操作函数讲解 形态学滤波:morphologyEx 函数 开运算:先腐蚀后膨胀。 闭运算:先膨胀后腐蚀。 形态学梯度: 膨胀图与腐蚀图之差。 顶帽:顶帽运算(Top Hat)又常常被译为”礼帽“运算,原图像与开运算图之差。 黑帽: 为”闭运算“的结果图与原图像之差。 参考博客1 参考博客2 数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。 morphology形态学操作函数主要包含了五个操作:开运算、闭运算、形态学梯度、顶帽、黑帽。opencv 将这些操作集合到了一个函数中 morphologyEx。要实现不同操作,仅需改变其第三个成员变量形态学运算标识符。 形态学滤波:morphologyEx 函数 void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue()); src,输入图像,即原图像,填 Mat 类的对象即可。dst,目标图像,需要和原图片有一样的尺寸和类型。op,形态学运算的类型。MORPH_ERODE = 0, //腐蚀 MORPH_DILATE = 1, //膨胀 MORPH_OPEN = 2, //开操作 MORPH_CLOSE = 3, //闭操作 MORPH_GRADIENT = 4, //梯度操作 MORPH_TOPHAT = 5, //顶帽操作 MORPH_BLACKHAT = 6, //黑帽操作 kernel,膨胀操作的核。当为 NULL 时,表示的是使用参考点位于中心,大小 3×3 的核。anchor,锚点的位置,默认位于中心。iterations 迭代使用 dilate() 的次数,默认值为 1。borderType,边界拓展的方法。borderValue,当边界为常数时的边界值,有默认值,一般不用管。 开运算:先腐蚀后膨胀。开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。 代码示例: import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE) plt.imshow(img, cmap='Greys_r') kernel = np.ones((1, 5), np.uint8) img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, anchor=(2, 0), iterations=2) #dilatazione cv2.imshow('open',img) cv2.waitKey(0)截图 闭运算能够排除小型黑洞(黑色区域),可以将团块的边缘突出出来。 代码演示: import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE) plt.imshow(img, cmap='Greys_r') kernel = np.ones((1, 5), np.uint8) img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, anchor=(2, 0), iterations=2) #dilatazione cv2.imshow('close',img) cv2.waitKey(0)截图 对二值图像进行这一操作可以将团块(blob)的边缘突出出来。我们可以用形态学梯度来保留物体的边缘轮廓。 代码演示: import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE) plt.imshow(img, cmap='Greys_r') kernel = np.ones((1, 5), np.uint8) img = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, anchor=(2, 0), iterations=2) #dilatazione cv2.imshow('MORPH_GRADIENT',img) cv2.waitKey(0)截图: 因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,所以顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。 代码演示: import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE) plt.imshow(img, cmap='Greys_r') kernel = np.ones((1, 5), np.uint8) img = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, anchor=(2, 0), iterations=2) #dilatazione cv2.imshow('MORPH_TOPHAT',img) cv2.waitKey(0)截图: 黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,黑帽运算用来分离比邻近点暗一些的斑块。 代码演示: import cv2 import numpy as np import matplotlib.pyplot as plt img=cv2.imread("C:\\Users\\Lijian\\Desktop\\test.jpg",cv2.IMREAD_GRAYSCALE) plt.imshow(img, cmap='Greys_r') kernel = np.ones((1, 5), np.uint8) img = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, anchor=(2, 0), iterations=2) #dilatazione cv2.imshow('MORPH_BLACKHAT',img) cv2.waitKey(0) 截图
|
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |